package com.qqtech.qquan.coupon.service;

import java.math.BigDecimal;
import java.util.List;

import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;

import com.qqtech.core.frame.model.Result;
import com.qqtech.core.frame.service.BaseService;
import com.qqtech.qquan.coupon.enums.CouponBaseBizzTypeDictEnum;
import com.qqtech.qquan.coupon.enums.CouponUserObtainWayDictEnum;
import com.qqtech.qquan.coupon.enums.CouponUserStatusDictEnum;
import com.qqtech.qquan.coupon.model.CouponBaseVo;
import com.qqtech.qquan.coupon.model.CouponUser;
import com.qqtech.qquan.coupon.model.CouponUserQuery;
import com.qqtech.qquan.coupon.model.CouponUserVo;
import com.qqtech.qquan.order.model.OrderItemVo;
import com.qqtech.qquan.user.model.UserIdentityVo;

public interface CouponUserService extends BaseService<CouponUser> {
	/**
	 *	有效期内满多少减多少最大金额的优惠卷
	 */
	CouponUserVo getMaxFullPriceMinusPrice(CouponBaseBizzTypeDictEnum bizzType,Integer userId,BigDecimal fullPrice,Integer bizzId);
	/**
	 * 调度自动过期优惠卷
	 */
	void autoExpire();
	/**
	 * leftBase表查询
	 * @param couponNo
	 * @return
	 */
	List<CouponUserVo> getLeftBase(CouponUserQuery couponUserQuery);
	/**
	 * 根据couponNo获取优惠卷
	 * 
	 * @param couponNo
	 * @return
	 */
	CouponBaseVo getBaseByCouponNo(String couponNo);

	/**
	 * 根据couponNo更新用户优惠卷状态
	 * 
	 * @param couponNo
	 */
	int updateByCouponNo(String couponNo, CouponUserStatusDictEnum couponUserStatusDictEnum);

	/**
	 * 用户获得优惠卷,并减少优惠卷基础表的库存
	 * 
	 * @param userId 用户id，couponId 优惠卷id，obtainWay 获得途径，obtainWayId 获得途径id
	 */
	Integer addCouponUser(Integer userId, Integer couponId, CouponUserObtainWayDictEnum obtainWay, Integer obtainWayId);

	/**
	 * 商城下单优惠卷
	 * 
	 * @param userId
	 * @return
	 */
	Result getMallOrderCouponList(Integer userId, List<OrderItemVo> orderItemVos,Integer couponUserId);
	
	/**
	 * 周边商城下单优惠卷
	 * 
	 * @param userId
	 * @return
	 */
	Result getQMallOrderCouponList(Integer userId, List<OrderItemVo> orderItemVos,Integer style);

	/**
	 * 获取下单时的服务类型可用优惠卷
	 * 
	 * @param userId
	 * @return
	 */
	 List<CouponUserVo> getHomemakingCoupon(Integer userId, Integer HomeMakingTypeId);

	/**
	 * 后台查询列表--分页
	 * 
	 * @param query
	 * @param pageable
	 * @return
	 */
	public Page<CouponUserVo> queryPageListAdmin(CouponUser query, Pageable pageable);
	
	/**
	 * 后台查询--数量
	 * @param query
	 * @return
	 */
	public int queryCountAdmin(CouponUser query);
	
	/**
	 * 后台查询列表--不分页
	 * 
	 * @param query
	 * @param pageable
	 * @return
	 */
	public List<CouponUserVo> queryListAdmin(CouponUser query, Pageable pageable);

	/**
	 * 批量添加 用户获得优惠卷,并减少优惠卷基础表的库存
	 * 
	 * @param userIds
	 * @param couponId
	 */
	public void addCouponUserBatch(List<Integer> userIds, Integer couponId, CouponUserObtainWayDictEnum obtainWay,
			Integer obtainWayId);
	
	/**
	 * 查询优惠券用户表的用户ids【去重了】
	 * @param couponBaseBizzType 优惠券类型【1-普通优惠卷;2-商城某件产品(实物);3-服务技能(服务券);4-商城类别;5-商城】
	 * @param couponUserStatus 优惠券状态【1-未使用;2-已使用;3-已过期】
	 * @return 用户表的用户ids
	 */
	List<Integer> getUserIdsNoRepeatedByBizzType(CouponBaseBizzTypeDictEnum couponBaseBizzType,
			CouponUserStatusDictEnum couponUserStatus);
	/**
	 * 查询--实物优惠券的用户--总页数
	 * @param pageSize
	 * @return
	 */
	int getUserTotalPage4MallProductCoupon(int pageSize);
	/**
	 * 查询--实物优惠券的用户--分页
	 * @param pageNum
	 * @param pageSize
	 * @return
	 */
	List<UserIdentityVo> getUserList4MallProductCoupon(int pageNum, int pageSize);
	/**
	 * 查询--家政服务优惠券的用户--总页数
	 * @param pageSize
	 * @return
	 */
	int getUserTotalPage4HomeMakingCoupon(int pageSize);
	/**
	 * 查询--家政服务优惠券的用户--分页
	 * @param pageNum
	 * @param pageSize
	 * @return
	 */
	List<UserIdentityVo> getUserList4HomeMakingCoupon(int pageNum, int pageSize);
	/**
	 *  统计优惠劵用户数量（不重复的）
	 * @param query
	 * @return
	 */
	int queryCount4UserNoRepeat(CouponUser query);

	/**
	 * 用户代金卷数量
	 * @param userId
	 * @return
	 */
	Integer queryCouponCount(Integer userId);


	Integer getUnusedCount(Integer userId);

	List<CouponUserVo> queryCouponCountByUserIds(List<Integer> userIds);
}